package com.example.service;


import jakarta.mail.MessagingException;
import jakarta.mail.internet.MimeMessage;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.core.io.FileSystemResource;
import org.springframework.mail.MailException;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.mail.javamail.JavaMailSenderImpl;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.stereotype.Service;

import java.io.File;

/**
 * @Author:徐莹
 * @Date:2025/03/04 13:43:52
 */

// 标记该类为Spring的服务组件，可以被Spring容器管理
@Service
public class SendEmailService {
    // 自动注入JavaMailSenderImpl类型的bean，用于发送邮件
    @Autowired
    private JavaMailSenderImpl mailSender;
    // 从配置文件中获取邮件发送者的用户名
    @Value("${spring.mail.username}")
    private String from;

    /**
     * 发送简单邮件
     * @param to 邮件接收者地址
     * @param subject 邮件主题
     * @param text 邮件正文内容
     */
    public void sendSimpleEmail(String to, String subject, String text) {
        // 创建一个简单的邮件消息对象
        SimpleMailMessage message = new SimpleMailMessage();
        // 设置邮件的发送者地址，这里的from变量应该在类中已经定义并初始化
        message.setFrom(from);
        // 设置邮件的接收者地址
        message.setTo(to);
        // 设置邮件的主题
        message.setSubject(subject);
        // 设置邮件的正文内容
        message.setText(text);
        // 使用try-catch结构来处理可能的邮件发送异常
        try {
            // 调用mailSender的send方法发送邮件
            mailSender.send(message);
            // 如果邮件发送成功，打印成功信息
            System.out.println("纯文本文件发送成功");

        } catch (MailException e) {
            // 如果邮件发送失败，打印失败信息以及异常信息
            System.out.println("纯文本文件发送失败" + e.getMessage());
            // 打印异常的堆栈跟踪信息，便于调试
            e.printStackTrace();
        }
    }

    /*
     * @param rscId 静态资源唯一标识
     * @param rscPath 静态资源路径
     * @param filePath 附件路径
     *  */




    /**
     * 发送复杂邮件（带附件和静态资源）
     * @param to 邮件接收者地址
     * @param subject 邮件主题
     * @param text 邮件正文内容
     * @param filePath 附件路径
     * @param rscId 静态资源唯一标识
     * @param rscPath 静态资源路径
     */
    public void sendComplexEmail(String to, String subject, String text, String filePath, String rscId, String rscPath) {

    // 创建一个MimeMessage对象，用于构建邮件
        MimeMessage message = mailSender.createMimeMessage();
        try {
            //使用帮助类，并设置多部件使用为true
            MimeMessageHelper helper = new MimeMessageHelper(message, true);
        // 设置邮件发送者地址
            helper.setFrom(from);
        // 设置邮件接收者地址
            helper.setTo(to);
        // 设置邮件主题
            helper.setSubject(subject);
        // 设置邮件正文内容，第二个参数为true表示内容为HTML格式
            helper.setText(text, true);
            //设置静态资源
            FileSystemResource res = new FileSystemResource(new File(rscPath));
        // 将静态资源添加到邮件中，rscId为静态资源的唯一标识
            helper.addInline(rscId, res);
            //设置邮件附件
            FileSystemResource file = new FileSystemResource(new File(filePath));
        // 获取附件文件名
            String fileName = filePath.substring(filePath.lastIndexOf(File.separator));
        // 将附件添加到邮件中
            helper.addAttachment(fileName, file);
            //发送邮件
            mailSender.send(message);
        // 打印发送成功信息
            System.out.println("复杂邮件发送成功");

        } catch (MessagingException e) {
        // 打印发送失败信息及异常信息
            System.out.println("复杂邮件发送失败" + e.getMessage());
        // 打印异常堆栈信息
            e.printStackTrace();
        }
    }


    /**
     * 发送模板邮件
     * @param to 邮件接收者地址
     * @param subject 邮件主题
     * @param content 邮件正文内容（支持HTML）
     */
    public void sendTemplateEmail(String to, String subject, String content) {
    // 创建一个MimeMessage对象，用于构建邮件
        MimeMessage message = mailSender.createMimeMessage();
        try {
        // 创建一个MimeMessageHelper对象，用于简化邮件的构建过程
            MimeMessageHelper helper = new MimeMessageHelper(message, true);
        // 设置邮件发送者地址
            helper.setFrom(from);
        // 设置邮件接收者地址
            helper.setTo(to);
        // 设置邮件主题
            helper.setSubject(subject);
        // 设置邮件正文内容，第二个参数为true表示内容为HTML格式
            helper.setText(content, true);

        // 使用mailSender发送邮件
            mailSender.send(message);
        // 打印发送成功的提示信息
            System.out.println("模板邮件发送成功");
        }catch (MessagingException e) {
        // 捕获MessagingException异常，打印发送失败的提示信息
            System.out.println("模板邮件发送失败" + e.getMessage());
        // 打印异常堆栈信息，便于调试
            e.printStackTrace();
        }
    }
}
